package cn.edu.zsc.rbac.service.array;

import cn.edu.zsc.rbac.domain.dto.BaseDto;
import cn.edu.zsc.rbac.domain.entity.BaseEntity;
import cn.edu.zsc.rbac.domain.vo.BaseVo;
import cn.edu.zsc.rbac.domain.vo.Result;
import cn.edu.zsc.rbac.service.IBaseService;
import java.util.Arrays;

/**
 * 业务层-基类
 *
 * @author 李玮炟
 * @since 2025/5/28 16:34
 */
abstract class BaseService <
        Entity extends BaseEntity,
        Dto extends BaseDto,
        Vo extends BaseVo> implements IBaseService<Entity,Dto> {

    static final int DATA_SIZE = 100;

    Entity[] data;

    Vo[] temp;
    private int idCounter = 1;
    @Override
    public boolean existsById(int id) {
        return id >= 1 && id < idCounter && data[id] != null;
    }

    @Override
    public Entity findById(int id) {
        if(existsById(id)){
            return data[id];
        }
        return null;
    }

    abstract Vo convertToVo(Entity entity);

    @Override
    public Result list() {
        int length = 0;
        for(int i = 1;i< idCounter; i++){
            if(data[i]!=null){
                temp [length++]= convertToVo(data[i]);
            }
        }
        return Result.success("查询成功", Arrays.copyOf(temp,length));
    }
    abstract Entity createEntity(Dto dto, int id);
    @Override
    public Result create(Dto dto) {
        if(idCounter > DATA_SIZE){
            return Result.failure("创建失败,超出了存储容量");
        }
        Entity entity = createEntity(dto,idCounter++);
        data[entity.getId()] = entity;
        return Result.success("创建成功",null);
    }

    abstract void updateEntity(Dto dto, Entity entity);
    @Override
    public Result update(Dto dto, int id) {
        if(existsById(id)){
            return Result.failure("更新失败,不存在该数据");
        }
        Entity entity = data[id];
        updateEntity(dto,entity);
        return Result.success("更新成功",null);
    }
}
